(deftemplate portatil
	(slot marca)
	(slot modelo)
	(slot velocidad)
	(slot ram)
	(slot memGrafica)
	(slot disco)
	(slot usbs)
	(slot so)
	(slot precio)
	(slot pantalla)
	(slot duracionBateria)
	(slot peso)
	(slot garantia)
	(slot calidad)
	(slot grabadora)
	(slot camara)
	(slot wifi)
	(slot bluetooth)
	(slot lectorTarjetas)
	(slot web)
	(slot dondeComprar)
)


(deffacts inicializar_portatiles 
	 (portatil(marca apple) (modelo macbook)(velocidad 2226)(ram 2)(memGrafica 256)
	      (disco 250) (usbs 2) (so MacOsX)(precio 850) (calidad media) (pantalla 13.3) (duracionBateria 7) (peso 2.13) (garantia 1)
		  (wifi si) (bluetooth si) (camara si) (grabadora si) (lectorTarjetas no) 
		  (web "http://www.apple.com/mac/") (dondeComprar "http://store.apple.com/es/browse/home/shop_mac/family/macbook"))
	
	 (portatil(marca apple) (modelo "macbook pro 13" )(velocidad 2400)(ram 4)(memGrafica 256)
	      (disco 320) (usbs 2) (so MacOsX)(precio 1100) (calidad "muy alta") (pantalla 13.3) (duracionBateria 10) (peso 2.04) (garantia 1)
		  (wifi si) (bluetooth si) (camara si) (grabadora si) (lectorTarjetas si) 
		  (web "http://www.apple.com/mac/") (dondeComprar "http://store.apple.com/es/browse/home/shop_mac/family/macbook_pro"))
	
	 (portatil(marca apple) (modelo "macbook pro 15" )(velocidad 2660)(ram 4)(memGrafica 512)
	      (disco 500) (usbs 2) (so MacOsX)(precio 2100) (calidad "muy alta") (pantalla 15.4) (duracionBateria 8) (peso 2.54) (garantia 1)
		  (wifi si) (bluetooth si) (camara si) (grabadora si) (lectorTarjetas si) 
		  (web "http://www.apple.com/mac/") (dondeComprar "http://store.apple.com/es/browse/home/shop_mac/family/macbook_pro"))
	
	 (portatil(marca apple) (modelo "macbook pro 17")(velocidad 2530)(ram 4)(memGrafica 512)
	      (disco 500) (usbs 3) (so MacOsX)(precio 2200) (calidad "muy alta") (pantalla 17) (duracionBateria 8) (peso 2.99) (garantia 1)
		  (wifi si) (bluetooth si) (camara si) (grabadora si) (lectorTarjetas si) 
		  (web "http://www.apple.com/mac/") (dondeComprar "http://store.apple.com/es/browse/home/shop_mac/family/macbook_pro"))
	
	 (portatil(marca apple) (modelo "macbook air")(velocidad 1066)(ram 2)(memGrafica 256)
	      (disco 120) (usbs 1) (so MacOsX)(precio 1400) (calidad alta) (pantalla 13.3) (duracionBateria 5) (peso 1.36) (garantia 1)
		  (wifi si) (bluetooth si) (camara si) (grabadora no) (lectorTarjetas no) 
		  (web "http://www.apple.com/mac/") (dondeComprar "http://store.apple.com/es/browse/home/shop_mac/family/macbook_air"))
)

;;(deffacts fase_inicial
;;   (fase calcular))

;;(assert (fase bienvenido))

(deffunction preguntar_repetir ()
  (printout t "Repetir? (s/n) ")
  (if (eq (read) s) then 
    (reset)
    (assert (fase bienvenido))
   else
    (remove fase)
	(assert (fase salir)))
)

(deffunction consultas ()
  (printout t "Especifico para videojuegos? (s/n) ")
  (if (eq (read) s) then 
	(remove especificoVideojuegos)
    (assert (especificoVideojuegos si))
   else
    (remove especificoVideojuegos)
	(assert (especificoVideojuegos no)))
  (printout t "Especifico para multimedia? (s/n) ")
  (if (eq (read) s) then 
	(remove especificoMultimedia)
    (assert (especificoMultimedia si))
   else
    (remove especificoMultimedia)
	(assert (especificoMultimedia no)))
  (printout t "Fijar precio maximo? (s/n) ")
  (if (eq (read) s) then 
	(remove importaPrecio)
    (assert (importaPrecio si))
   else
    (remove importaPrecio)
	(assert (importaPrecio no)))
  (printout t "Importa marca? (s/n) ")
  (if (eq (read) s) then 
	(remove importaMarca)
    (assert (importaMarca si))
   else
    (remove importaMarca)
	(assert (importaMarca no)))
  (printout t "Importa memoria? (s/n) ")
  (if (eq (read) s)  then 
	(remove importaMemoria)
    (assert (importaMemoria si))
   else
    (remove importaMemoria)
	(assert (importaMemoria no)))
  (printout t "Importa procesador? (s/n) ")
  (if (eq (read) s) then 
	(remove importaProcesador)
    (assert (importaProcesador si))
   else
    (remove importaProcesador)
	(assert (importaProcesador no)))
  (printout t "Importa tarjeta grafica? (s/n) ")
  (if (eq (read) s) then 
	(remove importaTarjetaGrafica)
    (assert (importaTarjetaGrafica si))
   else
    (remove importaTarjetaGrafica)
	(assert (importaTarjetaGrafica no)))
	
  (remove fase)
  (assert(fase comprobarConsulta))
)

(defrule bienvenida
   (fase bienvenido)
   =>
   (inicializar_portatiles)
   (printout t "Bienvenido a nuestro recomendador de portatiles "crlf)
   (consultas)
)

(defrule consultaPrecio
   (fase comprobarConsulta)
   (importaPrecio  ?ip)
   =>
   (if (eq ?ip si) then 
		(printout t "Precio maximo (en euros): ")
		(assert (precio (read)))
    else
     (assert (precio ))	 )
)   

(defrule consultaMarca
   (fase comprobarConsulta)
   (importaMarca  ?im)
   =>
   (if (eq ?im si) then 
		(printout t "Marca: ")
		(assert (marca (read)))
    else
     (assert (marca ))
	 )
)   

(defrule consultaMemoria
   (fase comprobarConsulta)
   (importaMemoria ?ime)
   =>
   (if (eq ?ime si) then 
		(printout t "Memoria (en GBs): ")
		(assert (memoria (read)))
    else
     (assert (memoria ))
	 )
)   
(defrule consultaProcesador
   (fase comprobarConsulta)
   (importaProcesador ?ipr)
   =>
   (if (eq ?ipr si) then 
		(printout t "Procesador (en MHz): ")
		(assert (procesador (read)))
    else
     (assert (procesador ))
	 )
)   


(defrule consultaVideojuegos
   (fase comprobarConsulta)
   (especificoVideojuegos  ?ev)
   =>
   (if (eq ?ev si) then 
		(assert (tarjeta_grafica 500))
		(assert (memoria 3))
    else
     (assert (tarjeta_grafica ))
	 (assert (memoria ))
	 )	
 )
 
 (defrule consultaTarjetaGrafica
   (fase comprobarConsulta)
   (importaTarjetaGrafica  ?itg)
   (especificoVideojuegos  ?ev)
   =>
   (if (eq ?ev no) then 
		(if (eq ?itg si) then 
			(printout t "Tarjeta Grafica (en MBs): ")
			(assert (tarjeta_grafica (read)))
		else
			(assert (tarjeta_grafica ))
			(assert (memoria ))
		)	
	)	
 )
 
 (defrule consultaMultimedia
   (fase comprobarConsulta)
   (especificoMultimedia  ?em)
   =>
   (if (eq ?em si) then 
		(assert (usbs 2))
		(assert (pantalla 14))
		(assert (bateria 7))
		(assert (grabadora si))
		(assert (camara si))
		(assert (wifi si))
		(assert (bluetooth si))
		(assert (lectorTarjetas si))
    else
     (assert (usbs ))
	 (assert (pantalla ))
	 (assert (bateria ))
	 (assert (grabadora ))
	 (assert (camara ))
	 (assert (wifi ))
	 (assert (bluetooth ))
	 (assert (lectorTarjetas ))
	 )	
 )
 
 (defrule consultaFin
   (fase comprobarConsulta)
   =>
   (remove fase)
   (assert(fase calcular)))

   
   
		 
		 
(defrule comprobarprocesador "procesador"
   (declare (salience 5))
   (fase calcular)
   ?portatil <- (portatil (velocidad ?proc))
   (procesador  ?procMin ?procMax)
   (test (or (< ?proc ?procMin)(> ?proc ?procMax)))
   =>
   (retract ?portatil)
   (printout t "Descartando modelo por procesador: " ?portatil.modelo crlf) 
 )
 
 (defrule comprobarPrecio "precio"
   (declare (salience 5))
   (fase calcular)
   ?portatil <- (portatil (precio ?prec))
   (precio  ?precioMin ?precioMax)
   (test (or (< ?prec ?precioMin)(> ?prec ?precioMax)))
   =>
   (retract ?portatil)
   (printout t "Descartando modelo por precio: " ?portatil.modelo crlf) 
 )
 
  (defrule comprobarTarjetaGrafica "tarjeta grafica"
   (declare (salience 5))
   (fase calcular)
   ?portatil <- (portatil (memGrafica ?graf))
   (tarjeta_grafica  ?grafMin ?grafMax)
   (test (or (< ?graf ?grafMin)(> ?graf ?grafMax)))
   =>
   (retract ?portatil)
   (printout t "Descartando modelo por tarjeta grafica: " ?portatil.modelo crlf) 
 )
 
   (defrule comprobarMemoria "memoria"
   (declare (salience 5))
   (fase calcular)
   ?portatil <- (portatil (ram ?mem))
   (memoria  ?memMin ?memMax)
   (test (or (< ?mem ?memMin)(> ?mem ?memMax)))
   =>
   (retract ?portatil)
   (printout t "Descartando modelo por memoria: " ?portatil.modelo crlf)
) 

 (defrule comprobarPantalla "pantalla"
   (declare (salience 5))
   (fase calcular)
   ?portatil <- (portatil (pantalla ?pa))
   (pantalla ?pantallaMin ?pantallaMax)
   (test (or (< ?pa ?pantallaMin)(> ?pa ?pantallaMax)))
   =>
   (retract ?portatil)
   (printout t "Descartando modelo por pantalla: " ?portatil.modelo crlf) 
 )

  (defrule comprobarBateria "bateria"
   (declare (salience 5))
   (fase calcular)
   ?portatil <- (portatil (duracionBateria ?ba))
   (bateria ?bateriaMin ?bateriaMax)
   (test (or (< ?ba ?bateriaMin)(> ?ba ?bateriaMax)))
   =>
   (retract ?portatil)
   (printout t "Descartando modelo por bateria: " ?portatil.modelo crlf) 
 )
 
 (defrule comprobarDisco "disco"
   (declare (salience 5))
   (fase calcular)
   ?portatil <- (portatil (disco ?dis))
   (disco ?discoMin ?discoMax)
   (test (or (< ?dis ?discoMin)(> ?dis ?discoMax)))
   =>
   (retract ?portatil)
   (printout t "Descartando modelo por disco: " ?portatil.modelo crlf) 
 )

 (defrule comprobarGarantia "garantia"
   (declare (salience 5))
   (fase calcular)
   ?portatil <- (portatil (garantia ?gar))
   (garantia ?garantiaMin)
   (test (< ?gar ?garantiaMin))
   =>
   (retract ?portatil)
   (printout t "Descartando modelo por garantia: " ?portatil.modelo crlf) 
 )

 (defrule comprobarSO "SO"
   (declare (salience 5))
   (fase calcular)
   ?portatil <- (portatil (so ?so))
   (SO ?x)
   (test (not (eq ?so ?x)))
   =>
   (retract ?portatil)
   (printout t "Descartando modelo por SO: " ?portatil.modelo crlf) 
 )



   (defrule comprobarMarca "marca"
   (declare (salience 5))
   (fase calcular)
   ?portatil <- (portatil (marca ?marc))
   (marca  ?x)
   (test (not (eq ?marc ?x)))
   =>
   (retract ?portatil)
   (printout t "Descartando modelo por marca: " ?portatil.modelo crlf) 
 )
 
  (defrule comprobarUsbs "usbs"
   (declare (salience 5))
   (fase calcular)
   ?portatil <- (portatil (usbs ?us))
   (usbs ?x)
   (test (< ?us ?x))
   =>
   (retract ?portatil)
   (printout t "Descartando modelo por usbs: " ?portatil.modelo crlf) 
 )
   (defrule comprobarGrabadora "grabadora"
    (declare (salience 5))
    (fase calcular)
    ?portatil <- (portatil (grabadora ?gra))
    (grabadora  ?x)
    (test (not (eq ?gra ?x)))
	=>
	(retract ?portatil)
	(printout t "Descartando modelo por grabadora: " ?portatil.modelo crlf) 
    )
	
	(defrule comprobarLectorTarjetas "lectorTarjetas"
    (declare (salience 5))
    (fase calcular)
    ?portatil <- (portatil (lectorTarjetas ?lt))
    (lectorTarjetas  ?x)
    (test (not (eq ?lt ?x)))
	=>
	(retract ?portatil)
	(printout t "Descartando modelo por lector de tarjetas: " ?portatil.modelo crlf) 
    )
 
 (defrule imprimirResultado "Imprimir resultado"
    (declare (salience 1))
	(fase calcular)
	?portatil <- (portatil (velocidad ?proc))
   =>
   (printout t "--------------------------------------------------------------------------------" crlf) 
   (printout t "--------------------------    PORTATIL RECOMENDADO    --------------------------" crlf) 
   (printout t "--------------------------------------------------------------------------------" crlf) 
   (printout t " Modelo: " ?portatil.marca " " ?portatil.modelo crlf)
   (printout t " Procesador: " ?portatil.velocidad " MHz"crlf)
   (printout t " Memoria: " ?portatil.ram " GBs" crlf)
   (printout t " Tarjeta Grafica: " ?portatil.memGrafica " MB" crlf)
   (printout t " Disco duro: " ?portatil.disco " GB"crlf) 
   (printout t " Puertos USB: " ?portatil.usbs crlf) 
   (printout t " Sistema Operativo: " ?portatil.so crlf)
   (printout t " Precio: " ?portatil.precio " euros"crlf) 
   (printout t " Tamano de Pantalla: " ?portatil.pantalla " pulgadas" crlf) 
   (printout t " Autonomia Bateria: " ?portatil.duracionBateria " horas" crlf)
   (printout t " Peso: " ?portatil.peso " kg"crlf) 
   (printout t " Garantia: " ?portatil.garantia " anno(s)"crlf) 
   (printout t " Calidad: " ?portatil.calidad crlf) 
   (printout t " Grabadora: " ?portatil.grabadora crlf) 
   (printout t " Camara: " ?portatil.camara crlf) 
   (printout t " Wifi: " ?portatil.wifi crlf) 
   (printout t " Bluetooth: " ?portatil.bluetooth crlf) 
   (printout t " Lector de Tarjetas: " ?portatil.lectorTarjetas crlf) 
   (printout t " URL Informacion: " ?portatil.web crlf) 
   (printout t " URL Compra: " ?portatil.dondeComprar crlf) 
   (printout t "--------------------------------------------------------------------------------" crlf) 
   (printout t "" crlf)    
	
 )


(defrule finImprimirResultados "Imprimir resultado"
    (declare (salience 0))
	(fase calcular)
	(encontrado s)
   =>
   (preguntar_repetir)
 )
 
  (defrule sinResultados "Imprimir resultado"
    (declare (salience 0))
	?fact<-(fase calcular)
   =>
   (retract ?fact)
 )

(defquery obtener-portatiles
"Devuelve todos los PC's que hay en la BC"
?port<-(portatil)
)
		 

(reset)

(run)
